gpt4 book ai didi

iOS( objective-C )。从数组中获取 block 时应用程序崩溃

转载 作者:行者123 更新时间:2023-11-28 21:49:33 29 4
gpt4 key购买 nike

有一个关于 objective-c 中的 block 的问题。例如,我有一个 Action 列表。我正在初始化一个 block 数组:

self.actions =  @[
^() { [self showObject:self.object_1]; },
^() { [self showObject:self.object_2]; },
^() { [self showObject:self.object_3]; }
];

并在按下某行时调用它们:

- (void)pressedRowAtIndex:(NSInteger)index {
if (index < actions.count) {
void (^action)() = [actions objectAtIndex:index];
if (action != nil) {
action();
}
}
}

一切正常,没有问题。但是当我使用 initWithObjects 方法初始化我的 Action 数组时:

self.actions =  [NSArray alloc] initWithObjects:
^() { [self showObject:self.object_1]; },
^() { [self showObject:self.object_2]; },
^() { [self showObject:self.object_3]; },
nil
];

然后我尝试使用 NSArray 类的 objectAtIndex 方法通过索引获取操作时崩溃。

我理解这个 inits 之间的区别。第一个不像第一个那样增加引用计数。但是有人可以解释为什么它会崩溃吗?

编辑:

我发现的一切。也许我很笨,其他地方是另一个有用的信息。 enter image description here

终端中没有崩溃信息: enter image description here

Onik IV 代码:

小例子:

@interface ViewController () {
NSArray *actions;
}

@property (nonatomic, strong) NSString *object1;
@property (nonatomic, strong) NSString *object2;
@property (nonatomic, strong) NSString *object3;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.


actions = [[NSArray alloc] initWithObjects:
^() { [self showObject:self.object1];},
^() { [self showObject:self.object2]; },
^() {[self showObject:self.object3]; },
nil];



}

- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];

self.object1 = @"object 1";
self.object2 = @"object 2";
self.object3 = @"object 3";

void(^firsSimpleBlock)(void) = [actions lastObject];

firsSimpleBlock();

void(^simpleBlock)(void) = [actions firstObject];


simpleBlock();
}

-(void)showObject:(NSString *)object
{
NSLog(@"Show: %@",object);
}

@end

最佳答案

尝试这样的事情。

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

(^someBlock)(void) = ^void(void){
self.object1;
};
actions = [[NSArray alloc] initWithObjects:
[someBlock copy],
[someOtherBlock copy],
[anotherBlock copy],
nil];



}

block 在堆栈上分配,因此当帧从堆栈中移除时, block 将被移除,导致指向该 block 的所有指针的帆指针。当您分配一个带有文字“@”符号的对象时,该对象被分配到一个池中,因此所有“相同”的文字都指向同一个实例并且永远不会被释放。

NSString *a = @"A";
NSString *b = @"A";

指向同一个字符串实例,同时:

NSString *a = [NSString stringWithFormat:@"A"];
NSString *b = [NSString stringWithFormat:@"A"];

是两个不同的对象。

所以当你创建一个文字数组时它是有效的,但是当你动态添加 block 时,它们将在 BAD_ACCESS 使用它们时被删除。解决方案是向 block 发送“复制”消息,将其复制到堆中,并且不会释放该 block 。

关于iOS( objective-C )。从数组中获取 block 时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28834004/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com