小编Dav*_*Lin的帖子

如何在Objective-C中锁定/解锁@synchronized?

@synchronized不使用"锁定"和"解锁"来实现互斥吗?那怎么做锁定/解锁呢?

以下程序的输出仅为"Hello World".

@interface MyLock: NSLock<NSLocking>
@end

@implementation MyLock

- (id)init {
    return [super init];
}

- (void)lock {
    NSLog(@"before lock");
    [super lock];
    NSLog(@"after lock");
}

- (void)unlock {
    NSLog(@"before unlock");
    [super unlock];
    NSLog(@"after unlock");
}

@end


int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    MyLock *lock = [[MyLock new] autorelease];
    @synchronized(lock) {
        NSLog(@"Hello World");
    }

    [pool drain];
}
Run Code Online (Sandbox Code Playgroud)

synchronization objective-c

198
推荐指数
3
解决办法
18万
查看次数

为什么CFRelease(NULL)会崩溃?

CFRelease没有检查NULL的原因吗?当[nil release]时,这不是不可接受的; 自由(NULL); 删除NULL; 一切都很好吗?

objective-c core-foundation

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

有哪些类名可能表示需要重构?

我发现了一些像这样的文章,这些文章表明某些词语永远不应该被用作类名的一部分.当一个类在名称中包含其中一个单词时,表示代码应该被重构或重新设计.

例:

经理

理由:由于几乎所有课程都"管理"某些内容并且"经理"的含义非常广泛,人们可以将很多职责交给"经理"课程,同时仍然能够宣称课程"只有一件事".因此,使用"Manager"命名一个类并没有说明该类实​​际上做了什么.前面提到的文章"命名没有'经理'的Java类",显示了这一点:

例如,使用名为"UrlManager"的类 - 您无法判断它是否汇集URL,操纵URL或审核它们的使用.所有的名字告诉你,这不是一个URL,但它确实与它们一起工作.另一方面,名称"UrlBuilder"可以更好地描述该类的功能.

另一个例子:

帮手

原因:像"ThreadHelper"这样的类名使人们想知道为什么需要它以及为什么它不能只是"Thread"类的一部分.它实际上是适配器还是装饰器?如果是这样,那就这样命名.班级"线程"已经承担了太多的责任吗?如果是这样,重构并为新类赋予有意义的名称."助手"没有说明它正在做什么或它如何帮助.

类名中的其他单词是否表示需要重构或重新设计,应该避免?为什么?

编辑:我认为这些词语经常被使用

  • 它们通常具有广泛的含义
  • 它们几乎适合所有环境
  • 他们阻止设计师考虑更好的设计或名称
  • 人们相信使用它们是可以的

清洁代码一书列出了更多,但没有给出任何理由:

避免使用类名称中的管理器,处理器,数据或信息等字样.

如果有人能为他们提供可能的理由,那就太棒了.

相关问题:

命名类的最佳方法是什么?

refactoring naming

11
推荐指数
2
解决办法
2028
查看次数

永远不会调用具有默认参数的复制构造函数

为什么以下程序的输出只是int3和不int3&4

#include <iostream>

class B
{
public:
    explicit B(int i) { std::cout<<"int"<<i; }
    B(const B& rhs, int i = 0) { std::cout<<"&"<<i; }
};

int main(int, char**)
{
    B b(B(3), 4);
}
Run Code Online (Sandbox Code Playgroud)

命令: clang++ test.cpp -O0

编译器:Apple clang 3.0版(标签/ Apple/clang-211.12)(基于LLVM 3.0svn)

c++ llvm clang copy-constructor

7
推荐指数
1
解决办法
314
查看次数

更改@synchronized部分内的锁定对象

我可以做以下任何一项吗?他们会正确锁定/解锁同一个物体吗?为什么或者为什么不?假设有许多相同的线程使用全局变量"obj",它在所有线程启动之前被初始化.

1.

@synchronized(obj) {
    [obj release];
    obj = nil;
}
Run Code Online (Sandbox Code Playgroud)

2.

@synchronized(obj) {
    obj = [[NSObject new] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

synchronization objective-c

6
推荐指数
1
解决办法
4169
查看次数

使用隐式可转换对象调用移动重载函数时编译错误

该程序不使用clang++ test.cpp -std=c++0x以下编译:

class A
{
public:
    A() {}
    A(const A&) {}
    A(A&&) {}
    A& operator = (const A&) { return *this; }
    A& operator = (A&&) { return *this; }
};

class B
{
    A m_a;
public:
    operator const A &() const
    {
        return m_a;
    }
};

int main(int, char**)
{
    A a;
    B b;
    a = b; // compile error
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

Apple clang version 3.0 (tags/Apple/clang-211.10.1) (based on LLVM 3.0svn)

test.cpp:25:9: error: no viable conversion …
Run Code Online (Sandbox Code Playgroud)

c++ overloading clang move-semantics c++11

5
推荐指数
1
解决办法
1301
查看次数

如何在lldb中打印wchar_t字符串?

鉴于wchar_t* str;哪个指向以null结尾的utf32(或utf16)字符串,我应该使用什么命令在lldb中打印它?

lldb

4
推荐指数
1
解决办法
4304
查看次数