标签: objective-c-runtime

Objective C小语法澄清

我大部分时间都看过这段代码.这里定义了两个变量名,并且在实现中通过赋值进行合成.做这样的事情的目的是什么?喜欢保留2个单独的变量名称.这是一种惯例吗?

Test.h

@interface Test {
  id<something> _variable1;
}

@property (nonatomic, retain)  id<something> variable2;
Run Code Online (Sandbox Code Playgroud)

Test.m

@synthesize variable2 = _variable1
Run Code Online (Sandbox Code Playgroud)

objective-c objective-c-runtime

0
推荐指数
1
解决办法
91
查看次数

"无法识别的选择器发送到实例"错误是什么意思?

由于以下错误,我的应用程序崩溃了:

-[NSCFString count]: unrecognized selector sent to instance 0x612b060
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我它是什么意思,我怎样才能在我的代码中找到参考号为0x612b060的行

objective-c objective-c-runtime

0
推荐指数
1
解决办法
1万
查看次数

在运行时从类外部访问Objective-C ivar

我知道这个想法完全打破了封装,但是说我有以下类扩展:

@interface MyClass () {
    int reallyImportantIvar;
}
// ...
@end
Run Code Online (Sandbox Code Playgroud)

通常,类的行为应该在Objective-C层内部 - 发送和接收消息等.但是有一个('公共')子例程,我需要最好的性能和非常低的延迟,所以我更喜欢使用一个C方法.当然,如果我这样做,我就无法再访问reallyImportantIvar,这是我的性能关键任务的关键.

看来我有两个选择:

  1. 将实例变量改为静态变量.
  2. 通过Objective-C运行时直接访问实例变量.

我的问题是:选项2是否可能,如果可行,它的开销是多少?(例如,我还在查看O(n)算法来查找类的实例变量吗?)

c objective-c objective-c-runtime

0
推荐指数
2
解决办法
1033
查看次数

Objective C - 返回NSObject和return objc_getAssociatedObject()之间的区别

我有下一个代码:

// UITextField+Navigation.h
@interface UITextField (Navigation)

@property (weak, nonatomic) UIControl *nextUIControl;

@end

//UITextField+Navigation.m
@implementation UITextField (Navigation)

- (UIControl *) nextUIControl {
    return objc_getAssociatedObject(self, &defaultHashKey);
}

- (void) setNextUIControl:(UIControl *)nextUIControl {
    objc_setAssociatedObject(self, &defaultHashKey, nextUIControl, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end
Run Code Online (Sandbox Code Playgroud)

有什么区别:

return objc_getAssociatedObject(self, &defaultHashKey);
Run Code Online (Sandbox Code Playgroud)

return self.nextUIControl;
Run Code Online (Sandbox Code Playgroud)

我试过两种方式,第二种进入无限循环......为什么?也许这是一个明显的答案,但我是初学者^^'

提前致谢.

objective-c objective-c-runtime

0
推荐指数
1
解决办法
193
查看次数

@ try @ catch块没有捕获内部异常

好的,我以前从未见过这个.这是我的代码:

    @try {
        [self.avPlayer removeObserver:self forKeyPath:@"status"];
        [self.avPlayer removeObserver:self forKeyPath:@"rate"];
    } @catch (NSException *exception) {

    } @finally {

    }
Run Code Online (Sandbox Code Playgroud)

您可以清楚地看到,我在@try块中有这两行代码.但是,它仍然会崩溃我的应用程序.这是未捕获的异常消息:

无法从<AVPlayer 0x7fa8d714ad70>中删除观察者<SoulHLECellView 0x7fa8d2b536b0>作为关键路径"status",因为它未注册为观察者.

所以,非常清楚,这是由我上面发布的代码引起的.这怎么可能?我在这里错过了什么?

objective-c objective-c-runtime ios objective-c-blocks

0
推荐指数
1
解决办法
1086
查看次数